package com.cac.demo.util;

import cn.hutool.core.util.XmlUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import java.util.List;
import java.util.Map;

/**
 * @className: XmlCreateUtil
 * @description: （描述这个类的作用）
 * @author:
 * @date: 2024/6/22 14:31:31 周六
 * @version: 1.0
 */
public class XmlCreateUtil {

    // XML文档对象
    private Document doc;

    // XML文档元素节点的根节点对象
    public Element rootElement;

    /**
     * @Title: XmlCreateUtil
     * @Description: 创建xml文档
     * @param: rootElementName，xml文档根节点元素名，默认为root
     * @param: 返回创建好的xml文件根节点元素
     * @return: Element
     * @throws
     */
    public XmlCreateUtil(String rootElementName) {

        if ("".equals(rootElementName)||rootElementName==null) {
            rootElementName = "root";
        }

        // hutool的XmlUtil创建的XML默认是utf8编码
        this.doc = XmlUtil.createXml(rootElementName);

        this.rootElement = XmlUtil.getRootElement(this.doc);
    }


    /**
     * @Title: createRootChildNode
     * @Description: 在根节点下创建一个子节点，并添加属性值
     * @param: nodeName 要创建的子节点名
     * @return: Element
     * @throws
     */
    public Element createRootChildNode(String nodeName, Map<String,Object> paramMap) {

        // 创建子节点
        Element rootChildNode = this.doc.createElement(nodeName);

        // 添加属性值
        if (paramMap!=null) {
            for (Map.Entry<String, Object> entry : paramMap.entrySet()) {
                String key = entry.getKey();
                String value = String.valueOf(entry.getValue());

                value = attributeValueHandle(value);

                rootChildNode.setAttribute(key, value);
            }
        }

        // 将子节点放在根节点节点下
        this.rootElement.appendChild(rootChildNode);

        return rootChildNode;
    }


    /**
     * @Title: createElementChildNodes
     * @Description: 将查询出来的数据库数据写入xml指定节点下
     * @param: @param element 指定的父节点
     * @param: @param nodeName 每条数据创建的同名元素节点
     * @param: @param paramList 数据库数据List
     * @return: void
     * @throws
     */
    public void createElementChildNodes(Element element, String nodeName, List<Map<String,Object>> paramList) {

        if (paramList != null) {
            for (Map<String,Object> tempMap: paramList) {
                createElementChildNode(element,nodeName,tempMap);
            }
        }
    }

    /**
     * @Title: createElementChildNode
     * @Description: 在指定的元素节点下创建一个子节点，并添加属性值
     * @param: element 指定的元素节点
     * @param: nodeName 要创建的子节点名
     * @return: Element
     * @throws
     */
    public Element createElementChildNode(Element element,String nodeName,Map<String,Object> paramMap) {

        // 创建子节点
        Element childNode = this.doc.createElement(nodeName);

        // 添加属性值
        if (paramMap!=null) {
            for (Map.Entry<String, Object> entry : paramMap.entrySet()) {
                String key = entry.getKey();
                String value = String.valueOf(entry.getValue());

                value = attributeValueHandle(value);

                childNode.setAttribute(key, value);
            }
        }

        // 将子节点放在父节点下
        element.appendChild(childNode);

        return childNode;
    }


    /**
     * @Title: attributeValueHandle
     * @Description: 针对数据库数据在Java中的处理
     * @param:  attributeValue
     * @return: String
     * @throws
     */
    private String attributeValueHandle(String attributeValue) {

        // 针对数据库数据，null字符串转为空
        if ("null".equals(attributeValue)) {
            attributeValue = "";
        }

        // 避免和xml文档本身的标签<>冲突，如果数据库的数据有<>，转为&lt;和&gt;
        attributeValue = attributeValue.replace("<", "&lt;").replace(">", "&gt;").replace("/t", "");

        return attributeValue;
    }

    /**
     * @Title: writeToFile
     * @Description: 将xml内容写到指定文件中
     * @param: FilePath 指定的xml文件绝对路径 ，如：D:\\Test\\test.xml
     * @return: void
     * @throws
     */
    public void writeToFile(String FilePath) {
        XmlUtil.toFile(this.doc, FilePath);
    }
}
